package org.fenixsoft.jvm.chapter10;

import org.fenixsoft.jvm.chapter10.lombok.LombokJavaBean;
import org.junit.Test;

import java.lang.reflect.Array;
import java.util.*;

/**
 * @author zzm
 */
public class AutoBoxing {

    public static void main(String[] args) {
        LombokJavaBean lombokExample = new LombokJavaBean();
    }

    @Test
    public void aotoBoxing() {
        /**
         * 查看字节码，实际上做了装箱调用了Integer.valueOf()方法，[-128,127]的Integer会被缓存,
         * 这里的a, b, c, d都会被缓存；
         * 而e, f 超出了[-128,127]，所以每次都会产生新的对象
          */
        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 321;
        Integer f = 321;
        Long g = 3L;
        System.out.println(c == d);//true，d是从缓存中获取的，实际上是一个对象
        System.out.println(e == f);//false，e和f是不同的对象

        /**
         * ==等值比较，在没遇到不会自算数运算符是不会自动拆箱。
         * 查看字节码可知，这里c, a, b都进行了拆箱，所以仅仅比较了值
         */
        System.out.println(c == (a + b));//true

        /**
         * Integer.equals()比较的是值
         */
        System.out.println(c.equals(a + b));//true
        System.out.println(g == (a + b));//true

        /**
         * Long.equals()，参数必须为Long类型，并且值相等
         */
        System.out.println(g.equals(a + b));//false
    }

    public static <T> T[] convert(List<T> list, Class<T> componentType) {
        T[] array = (T[]) Array.newInstance(componentType, list.size());
        return array;
    }

    /**
     * 编译后的字节码，只是对map.get()的value做了强制转化
     */
    public void genericTest() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("hello", "你好");
        map.put("how are you?", "吃了没？");
        System.out.println(map.get("hello"));
        System.out.println(map.get("how are you?"));
    }

    @Test
    public void noGeneric1() {
        Object[] objects = new String[10];
        objects[0] = 10;// 编译期不会有问题，运行时会报错
    }

    @Test
    public void noGeneric2() {
        ArrayList list = new ArrayList();
        list.add(Integer.valueOf(10));
        list.add("hello world");

        for (Object obj : list) {
            System.out.println(obj);
        }
    }
}
